paris

paris

crédit photo

La proposition première de Airbnb est celle de expérience du voyage. Non pas cette sagesse qui s’accumule au travers des rencontre, mais le sentiment gratifiant de vivre quelque chose exceptionnel, unique, authentique, pleine de rencontre et de découverte. Trouve-t-on l’écho de cette expérience dans le contenu considérable des avis produit par les voyageurs et les hôtes qui les accueillent. A quels aspects de l’expérience se réfèrent-il ?

1. Introduction

Dans cette note de recherche nous analysons 1 000 000 d’avis de voyageurs relatifs aux 57000 offres disponibles en février 2019. Ces données proviennent du site Inside Airbnb. L’objectif est de construire un modèle de topic sur la base de différentes techniques d’annotation. Elles sont utilisées pour filtrer les éléments du corpus et donner plus de lisibilité aux solutions obtenues. On y utilise une technique d’identification des dépendances syntaxiques pour affiner l’analyse.

Le “pipe” de traitement consiste à

    1. Détecter les langues employées dans le corpus
    1. Pour chacune des langues, annoter les tokens (les termes) par une analyse des éléments du discours (POS)
    1. Réduire le corpus aux : noms communs, aux adjectifs et adverbes, ainsi qu’au verbes. et éliminer nom de lieu, ponctuations etc.
    1. Construire le modèle LDA
    1. Le visualiser avec LDAvis
    1. Annoter le corpus avec les dépendances et examiner la relation des noms communs et de leurs adjectifs.

1.1 Initialisation

pour l’identification des langues on emploie texcat, l’annotation est réalisée avec cleanNLP, on emploie text2vec pour le LDA, pour la représentation des dépendances packcircles sera utile. Pour le détail du code on consultera le repo.

la lecture du fichier ne pose aucune difficulté, en voici les 7 premiers éléments pour avoir une idée de sa structure.

## Parsed with column specification:
## cols(
##   listing_id = col_double(),
##   id = col_double(),
##   date = col_date(format = ""),
##   reviewer_id = col_double(),
##   reviewer_name = col_character(),
##   comments = col_character()
## )
## # A tibble: 7 x 6
##   listing_id      id date       reviewer_id reviewer_name comments         
##        <dbl>   <dbl> <date>           <dbl> <chr>         <chr>            
## 1       2577  3.66e8 2019-01-02    28047930 Kate          "Beautiful apart~
## 2       5396  4.82e3 2009-06-30       19995 Sarah         Perfect location~
## 3       5396  4.97e3 2009-07-03       20117 Chris         This is a nice p~
## 4       5396  5.24e3 2009-07-08       22190 Annelaure     Nice studio, ver~
## 5       5396  9.62e3 2009-09-10       11947 Jean          "Superb location~
## 6       5396  1.90e4 2009-12-02       40625 Bette         Perfect place to~
## 7       5396  2.56e4 2010-02-07       50781 Amy           Wonderful hosts ~

1.2 Echantillonner les données pour mieux calibrer

Pour mettre au point les analyses, on s’appuie sur un échantillon restreint, on attaque que dans un temps final les 1 097 737 commentaires qui demanderons plusieurs heures de traitement. Certaines opérations ( détection des langues et annotation) demande un très long temps de calcul. Dans cette version, on se contente de 30 000 commentaires.

Pour se donner une idée plus précise de leur nature, on examine leur distribution dans le temps. Celle-ci illustre la croissance de la plateforme, mais plus encore, dans la mesure où ces commentaires se rapportent à l’offre disponible le 4 février 2019, l’ancienneté des offres dans l’inventaires de Airbnb.

En réalité il s’agit moins d’une série chronologique que d’une pyramide des ages. En effet les données résultent d’un processus marqué d’abord par la disparition des logements de l’inventaire de Airnb - le faible nombre des avis en 2010 et 2011, reflètent le fait que très peu d’offres proposées à cette période le sont encore à la date de l’étude, mais aussi par le fait u’à chaque période de nouvelles offres génèrent de nouveaux avis.

Une autre représentation est préférable, en pyramide des âge de l’offre. On s’aperçoit que la valeur centrale de l’age des annonces est de l’ordre de deux ans.( à calculer plus précisément )

df$year<-year(df$date)

g02<-df %>% 
  ggplot(aes(year)) + 
  geom_histogram(binwidth = 1,fill="royalblue3") + labs(title = "Pyramide des âges des annonces",caption = "AirBnb Inside",x="années",y="nombre d'avis") +coord_flip()+scale_x_continuous(breaks = c(2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019))+theme_minimal()

g02

2. Identification des langues

Quand les corpus sont constitués de plusieurs langues, il est donc essentiel de pouvoir les identifier afin de leur appliquer un traitement adéquat et indépendant. Les langues se construisent en elle-mêmes, par leur lexique et leur grammaire.

2.1 avec textcat

A cette fin on emploie le package textcat(Hornik et al. (2013)), qui s’appuie sur la distribution des ngrams propre à chaque langue et qui constituent en quelque sorte leur signature. Le principe est de calculer une distance entre la distribution des ngram du texte cible avec celle qui caractérise les langues.

calcul de distance à la langue

calcul de distance à la langue

L’attribution à une langue se fait avec le critère de la plus faible distance de la cible.

On examinera la fiche wikipedia pour plus de détail sur l’utilisation des Ngrams en NLP.

#la détection de langue
df$langue<-textcat(df$comments) #attention c'est long - une bonne dizaines de minutes.

Incidemment on notera la domination des contenus en anglais (un peu plus de 60%) le français ne comptant que pour 22%, l’espagnol et l’allemand suivent avec moins de 5%. Dans la suite de l’exercise on se concentre sur le corpus anglophone, on laisse le soin au lecteur de reproduire l’analyse sur les autres langues.

On représente celà par une sorte de pyramide des ages composées par les langages. Le second diagramme donne les proportion d’avis par langue au cours de la période : on assiste à une forte diversication des langues. En 2010 les commentaires sont essentiellement en anglais, le français émerge en 2013 pour prendre un tiers des avis produits chaque année. Les autres langues progressent aussi et l’anglais cède du terrain pour ne plus représenter que la moitié des avis.

2.2 Les locuteurs

en compléments, il peut être utile de s’intéresser aux locuteurs pour lesquels on dispose de peu d’informations sinon leur pseudonymes.

On peut en tirer au moins une information sur le genre en matchant avec une table des prénoms. Il semblerait que les femmes contribuent plus que les hommes, mais parmi les prénoms plus fréquents, on retrouve plutôt des hommes.

3. La lemmatisation

Avant d’explorer plus avant le contenu des tweets, on va d’abord annoter le corpus en utilisant les ressources de cleanNLP et en particulier son outil d’analyse des parties du discours et de lemmatisation qui permettra à la fois d’obtenir les lemmes correspondants à chaque des termes mais aussi à leur forme morphosyntaxique. Nous nous inspirons largement de leur [étude de cas] (https://cran.r-project.org/web/packages/cleanNLP/vignettes/case_study.html)

3.1 Des éléments du discours

La composition en termes morphosyntaxique n’est pas forcément évidente à interprêter, il faudrait connaitre la distribution dans un corpus de référence. Mais cette annotation est cependant utile pour filtrer le contenu.

#library(cleanNLP)
text<-df_en$comments

cnlp_init_udpipe(model_name = "english")
obj <- cnlp_annotate(text, as_strings = TRUE)
head(cnlp_get_token(obj))
## # A tibble: 6 x 10
##   id      sid   tid word    lemma   upos  pos     cid   pid s_after
##   <chr> <int> <int> <chr>   <chr>   <chr> <chr> <int> <int> <chr>  
## 1 doc1      1     1 Anne    Anne    PROPN NNP       0     1 " "    
## 2 doc1      1     2 Laure   Laure   PROPN NNP       5     1 ""     
## 3 doc1      1     3 's      's      PART  POS      10     1 " "    
## 4 doc1      1     4 flat    flat    NOUN  NN       13     1 " "    
## 5 doc1      1     5 was     be      AUX   VBD      18     1 " "    
## 6 doc1      1     6 perfect perfect ADJ   JJ       22     1 " "
Vocab<-cnlp_get_token(obj)
Table <- with(Vocab, table(upos))
ling<-as.data.frame(Table)
g1<-ggplot(ling,aes(x=reorder(upos,Freq),y=Freq))+geom_bar(stat="identity",fill="darkgreen")+coord_flip()+theme_minimal()+theme(text = element_text(size=9))
g1+labs(title = "Fréquence des catégories morpho-syntaxique",caption = "AirBnb Inside",x="catégorie",y="nombre d'avis")

Nous pouvons désormais travailler sur un corpus linguistiquement plus homogène. On doit remarquer que le caractère cardinal du découpage est aussi fonction de convention. On pourrait imaginer une dectetion des langues plus fine qui prendrait en compte les dialectes. C’est le travail des linguistes que de produire des catégories pertinentes et nous nous fierons à leurs avancées.

3.2 verbes, noms communs et adjectif et adverbes

Le texte à l’état brut comporte de nombreux signes qui amènent peu de sens lexical : des point , des noms de lieux, des déterminants. La stratégie que nous engagons est différentes de cette de tm qui juxtapose : mise en minuscule, suppresion des ponctuactions, des mentions et des ref html, notre stratégie n’élimine pas mais se concentre sur les éléments lexicaux les plus signifiants. (au moins de manières premières, les autres éléments secondaires peuvent révéler des inflexions plus fines, comme l’usage de la ponctuation le permet - Proust l’aura démontré ref les coutures proust)

Il s’agira simplement des verbes, des noms propres, des adjectifs et des adverbes. On en présente les trois distributions.

  • les noms communs mettent en tête des éléments liés aux logement, à sa localisation et son voisinage, aisi qu’au séjour et à l’accueil.
  • Les qualificatifs sont très positifs et principalement expressifs, proche, propre et confortable en sont les attributs les plus fréquents
  • Les verbes traduisent une intention : recommendation, des mouvements : stay, walk go et des transaction : get, need…

L’expérience reste largement inexprimée si ce n’est pas un jugement très positif qui nous incite à explorer dans une prochaine note les sentiments et émotions associées.

4. Un modèle LDA de topics

pour mieux cerner les sujet on utilise le desormais bien connu modèle LDA avec la solution proposée par text2vec et la solution de visualisation interactive LDAvis.

On ne retient qu’une partie du corpus : les adjectifs, les noms communs et les verbes. La méthode nous permet d’oter nombres et signes de ponctuations comme on le fait avec tm et les autres packages, mais aussi les noms de lieux (noms communs) qui peuvent “fragmenter” les topics en donnant une spécificité géographiques. On travaille sur les lemmes ce qui permet de réduire le bruit générés par les fautes d’orthographes inévitables dans un corpus dont la langue est largement vernaculaire.

Les résultat se présente sous la forme d’une liste des termes les plus pertinents selon le critère proposé par (???) .

En synthèse on trouve :

  • Un thème représentant clairement l’accueil par l’hôte. (9%)
  • Deux thèmes relatif à l’environnement, l’un orienté vers le voisinage accessible au bas de l’immeuble :café, boutiques, restaurants, l’autre à l’interconnexion avec les moyens de transports.(26%)
  • Deux thèmes relatifs aux éléments matériels : la facilité d’usage du service, les équipements du logement (le lit en tête). (32%)
  • trois thèmes exprimant la satisfaction l’égard du sejour et l’intention de recommander, un autre manifestant l’enthousiasme, le dernier enfin évoque pleinement l’expérience (36% des tokens).

L’expérience n’est pas absence mais pas dominante. L’usage du logement et l’environnement proche sont les thématiques principales des avis de consommateurs.

## INFO [2019-04-19 12:49:32] iter 25 loglikelihood = -951598.955
## INFO [2019-04-19 12:49:33] iter 50 loglikelihood = -928082.593
## INFO [2019-04-19 12:49:33] iter 75 loglikelihood = -914132.251
## INFO [2019-04-19 12:49:34] iter 100 loglikelihood = -905062.977
## INFO [2019-04-19 12:49:35] iter 125 loglikelihood = -899297.166
## INFO [2019-04-19 12:49:35] iter 150 loglikelihood = -895516.313
## INFO [2019-04-19 12:49:36] iter 175 loglikelihood = -891796.895
## INFO [2019-04-19 12:49:37] iter 200 loglikelihood = -889165.487
## INFO [2019-04-19 12:49:37] iter 225 loglikelihood = -888726.125
## INFO [2019-04-19 12:49:37] early stopping at 225 iteration

on pourra générer une visualisation dynamique qui facilite l’interprétation avec le package LDAvis, en activant le code suivant. (on peut voir ici une démonstration )

# la visualisation interactive
library(LDAvis)
lda_model$plot()

Le résultat est une visualisation interactive qui pour chacun des topics et des mots indique :

  • sa proximité avec les autres topics via une analyse des similarités, ce qui est représenté sur le panneau de gauche. La surface des cercles est proportionnelle à la frequence des tokens.
  • pour un topic donné, le profil est indiqué à droite : les trente principaux termes classés par pertinence, leurs fréquences sont indiquées sur les barres horizontales et comparées à la fréquence du mot dans l’ensemble du corpus.
  • en cliquant sur les mots on peut aussi observer leur distribution dans les différents groupes.
ldavis06

ldavis06

5. Analyse des dépendances

Certains annotateurs peuvent repérer les règles grammaticales et trouver pour un mot cible ses corrélats. Un nom commun peut être ainsi associé à des adjectifs qui le qualifient et le nuancent.

on choisit la dépendence “amod” : adjectival modifier - An adjectival modifier of an NP is any adjectival phrase that serves to modify the meaning of the NP.“Sam eats red meat”amod(meat, red). Pour plus de détail il faut consulter le Stanford typed dependencies manual Marie-Catherine de Marneffe and Christopher D. Manning September 2008 Revised for Stanford Parser v. 1.6.2 in February 2010 on en trouvera un exposé ici [universal dependencies]: (http://universaldependencies.org/u/dep/).

Pour mieux comprendre le modèle LDA on peut ainsi être inciter à étudier certains des lemmes contributifs (on ne travaille plus sur le texte brute mais sur un texte filtré). Dans l’exemple suivant, on s’inspire [du code suivant] (https://github.com/yanhann10/opendata_viz/tree/master/refugee) commenté ici, on représente les qualificatifs de 4 notions qui apparaissent comme étant les plus fréquentes au travers de leur manifestation par l’usage de noms communs : le logement, son environnement, l’hôte et le séjour.

6. Conclusion

Pour amener l’étude à son terme, il faudrait naturellement examiner la distributions des sujets d’avis sous l’angle d’une analyse comparative de groupes de commentateurs.

On aura réussi à partir de l’analyse des langues à leur attribué une origine culturelle de ces commentateurs, on aura aussi déterminer leur genre à partir de l’analyse des prénoms. On pourrait aussi les qualifier en terme d’engagement en dénombrant le nombre des avis qu’ils ont produits. Même si on possède peu d’informations relatives aux auteurs des avis, on peut en identifier certaines à partir de ce qu’ils écrivent.

Reste à systématiser la comparaison : utilise-t-on les même qualificatifs selon qu’on soit un homme, une femme? Selon l’habitude que l’on a du service ? Selon l’origine culturelle? Parle-t-on des mêmes sujets ?

L’objectif de cette note demeure l’exposition de quelques techniques d’analyse et n’a pour but que de stimuler l’imagination. Ses résultats sont des faits que l’on peut questionner grace à l’ampleur du corpus. L’objectif est de fournir un premier outillage pour des recherches mieux problématisées.

7. Bibliographie

Hornik, Kurt, Patrick Mair, Johannes Rauch, Wilhelm Geiger, Christian Buchta, and Ingo Feinerer. 2013. “The Textcat Package for N -Gram Based Text Categorization in R.” Journal of Statistical Software 52 (6). https://doi.org/10.18637/jss.v052.i06.